const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const path = require('path')
const flag = process.env.NODE_ENV === 'production'
module.exports = {
  // 打包模式: production（生产模式），development(开发模式)
  mode: 'development',
  // 开发环境下的推荐配置
  // devtool: 'eval-cheap-module-source-map',
  // 生产环境下的推荐配置
  // devtool: flag ? 'nosources-source-map' : 'eval-cheap-module-source-map',
  // 入口
  entry: './src/index.js',
  // 出口 = 目录名(绝对路径) + 文件名
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  // 插件
  plugins: [
    // 一个个的插件实例
    /* 这个插件的作用：
      1. 创建一份新的html文件
      2. 自动引入打包后的代码
    */
    new HtmlWebpackPlugin({
      template: './public/index.html'
    }),
    new MiniCssExtractPlugin({
      // [name]: 占位符，默认值是 main
      filename: 'css/[name].css'
    }),
    new CleanWebpackPlugin()
  ],
  // 模块解析
  module: {
    // 规则
    rules: [
      {
        test: /\.css$/i,
        // 注意：多个loader的执行顺序：从后往前执行的（顺序不能换）
        use: [
          flag ? MiniCssExtractPlugin.loader : 'style-loader',
          'css-loader',
          'postcss-loader']
      }, {
        test: /\.less$/i,
        use: [
          flag ? MiniCssExtractPlugin.loader : 'style-loader',
          'css-loader',
          'postcss-loader',
          'less-loader']
      }, {
        test: /\.(png|jpe?g|gif|webp|svg)$/i,
        type: 'asset',
        // Webpack5中，asset资源模块处理图片的标准如下：
        // 看图片大小是否超过8KB，
        // 超过了，直接打包到dist目录下，我们可以对其重命名，
        // 如果没有超过，把图片转成base64格式打包到js中
        generator: {
          filename: 'image/[hash:18]-[name][ext]'
        }
      }, {
        test: /\.(eot|woff2?|ttf|svg)$/i,
        type: 'asset/resource',
        generator: {
          filename: 'font/[name][ext]'
        }
      }, {
        test: /\.m?js$/,
        use: {
          loader: 'babel-loader'
        }
      }
    ]
  }
}
